# -*- coding:utf-8 -*-
'''
JOAQUÍN RAMÓN ANTÚNEZ SÁNCHEZ
19 de septiembre de 2014
'''

import MySQLdb as db

class jr:
    __instance = None
    __con      = None
    
    @staticmethod
    def instance():
        if not jr.__instance:
             jr.__instance = jr()
             jr.__con = db.connect("localhost", "root", "2629buruaz")
             jr.__con.query("SET NAMES 'utf8'")
             
        return jr.__instance
    
    def inc(self, campo, tabla, condicion = None):
        s = "SELECT MAX(%s) from %s" % ( campo, str(tabla).lower() )
        if condicion: s += "\nwhere %s" % (condicion)
        cursor = jr.__con.cursor()
        cursor.execute(s)
        row = cursor.fetchone()
        cursor.close()
        cursor = None
        
        x = 0
        if row and row[0]: x = row[0]
        x += 1
        
        return x
    
    def execute(self, sql):
        rows = None
        cursor = jr.__con.cursor(db.cursors.DictCursor)
        try:
            cursor.execute(sql)
            if str(sql).lower().strip().startswith("select") == True:
                rows = cursor.fetchall()
            else:
                jr.__con.commit()
                rows = cursor.rowcount
        except Exception as e:
            print 'Error:', e.args   
        finally:
            cursor.close()
            cursor = None                          
        
        
        return rows
    
    def size(self, campo, tabla):
        x = 0
        sql = "show columns from %s like '%s'" % ( tabla, campo )
        cursor = jr.__con.cursor(db.cursors.DictCursor)
        try:
            cursor.execute(sql)
            row = cursor.fetchone()
            if row and row['Type']:
                x1 = str(row["Type"]).find('(')            
                x2 = str(row["Type"]).find(')')
                if x1 != -1 and x2 != -1:
                    x = str(row['Type'])[x1 + 1 : x2]
        except Exception as e:
            print 'Error:', e.message
        finally:
            cursor.close()
            cursor = None
                            
        return x
                 
            
    def close(self):
        if not jr.__con:
            jr.__con.close()
            jr.__con = None
            
        jr.__instance = None
        

###########################################################################################################################
## Clase: reloj
###########################################################################################################################
'''Esta clase ha sido ideada para gestionar la duración total del disco y realizar el registro correspondiente
en los campos de la tabla.
La clase podrá recibir la duración en alguno de estos formatos (que son comprobados por la clase):
"mm", "mmm", "hh.mm:ss", "h.mm:ss", "mm:ss"
La clase devuelve la duración del disco (mediante la propiedad tiempo) en la forma "h.mm:ss"
No obstante, otras propiedades (horas, minutos, segundos) permiten modificar la visualización de la salida
'''


class reloj:
    def __init__(self, value = None):
        self.clear()
        if value: self.__set_tiempo(value)
        
    def clear(self):
        '''Coloca el reloj en cero'''
        self.__h = int(0)
        self.__m = int(0)
        self.__s = int(0)
        
    def __mmss(self, value):
        '''Función interna que devuelve la hora en formato mm:ss.
        Comprueba los valores y devuelve si el valor es correcto o no'''
        value = str(value)
        if len(value) != 5: return False
        if value[2:3] != ':': return False
        try:
            x1 = int( value[0:2] )
            x2 = int( value[3:5] )
            if x1 <  0 or x1 > 59: raise Exception()
            if x2 <  0 or x2 > 59: raise Exception()
            return True
        except:
            print 'Error de formato. Compruebe que se ajusta al tipo "mm:ss" o que el valor no es mayor a 60 ni menor a 0.'
            return False                    
        
    
    ## ------------------------------------------------------------------------
    ## PROPIEDADES DE LA CLASE
    ## ------------------------------------------------------------------------
    def __get_horas(self): return self.__h
    def __get_minutos(self): return self.__m
    def __get_segundos(self): return self._s
    
    def __set_horas(self, value):
        if value >= 0 and value <= 24: self.__h = value
    def __set_minutos(self, value):
        if value >= 0 and value <= 59: self.__m = value
    def __set_segundos(self, value):
        if value >= 0 and value <= 59: self.__s = value
        
    def __get_tiempo(self):
        if self.__h == 0 and self.__m == 0 and self.__s == 0: return ''
        if self.__h > 0:
            return '%s.%s:%s' % ( self.__h, str(self.__m).zfill(2), str(self.__s).zfill(2)  )    
        else:
            return '%s:%s' % ( str(self.__m).zfill(2), str(self.__s).zfill(2)  )
        
    def __set_tiempo(self, value):
        ''' Recibe el tiempo total del disco en alguno de estos formatos:
        mmm, mm, hh.mm:ss, h.mm:ss, mm:ss; realiza la conversión correspondiente'''
        self.clear()
        value = str(value).strip()
        if len(value) in [2, 3]: 
            self.__set_minutaje(value)
            return
        
        '''mm:ss'''
        if len(value) == 5 and self.__mmss(value):
            self.__h = 0
            self.__m = int( value[0:2] )
            self.__s = int( value[3:5])
            return
        
        '''h.mm:ss ó hh.mm.ss'''
        pos = value.find('.')
        if pos in [1, 2] and len(value) in [7, 8]:
            try:
                h  = int( value[0:pos] )                
                ms = value[pos + 1:]
                if not self.__mmss(ms): raise Exception
                self.__h = h
                self.__m = ms[0:2]
                self.__s = ms[3:5]
                return 
            except:
                print 'Compruebe el valor dado; al parecer el formato no es correcto'
                return
        
        return # ---> el final
            
        
        
        
    def __get_minutaje(self):
        '''devolver el total de minutos del disco'''
        h = self.__h
        m = self.__s
        while h > 0:
            m += 60
            h -= 1
        if self.__s > 30: m += 1
        return m
    def __set_minutaje(self, value):
        ''' Recibir el total de minutos de forma mmm ó mm para realizar la conversión correspondiente'''
        value = str(value)
        if len(value) in [2,3]: 
            try:
                x = int(value)
                self.__h = int(x / 60)
                self.__m = x % 60
                self.__s = 0                
                
            except Exception as e:
                print 'El valor de asignación no es un entero:\n"%s"' % (e.message)
        else:    
            self.clear()            
        
    horas   = property(__get_horas, __set_horas)
    minutos = property(__get_minutos, __set_minutos)
    segundos= property(__get_segundos, __set_segundos)
    tiempo  = property(__get_tiempo, __set_tiempo) # h.mm:ss ó mm:ss
    minutaje= property(__get_minutaje, __set_minutaje)                  